package main

import (
	"fmt"
	"log"
	"net/http"
	"time"

	"github.com/gorilla/mux"
)

// 中间件1：记录开始时间
func timingMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		start := time.Now()
		fmt.Printf("中间件1: 请求开始时间 %s\n", start.Format("15:04:05.000"))

		next.ServeHTTP(w, r)

		duration := time.Since(start)
		fmt.Printf("中间件1: 请求处理时间 %v\n", duration)
	})
}

// 中间件2：记录请求信息
func loggingMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Printf("中间件2: 收到请求 %s %s\n", r.Method, r.URL.Path)

		next.ServeHTTP(w, r)

		fmt.Printf("中间件2: 请求处理完成\n")
	})
}

// 中间件3：添加响应头
func headerMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Printf("中间件3: 添加响应头\n")
		w.Header().Set("X-Custom-Header", "Hello from middleware")

		next.ServeHTTP(w, r)

		fmt.Printf("中间件3: 响应头已添加\n")
	})
}

// 处理器
func helloHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Printf("处理器: 处理请求\n")
	w.Header().Set("Content-Type", "text/plain")
	w.Write([]byte("Hello, World!"))
	fmt.Printf("处理器: 响应已发送\n")
}

func main() {
	router := mux.NewRouter()

	// 按顺序添加中间件
	router.Use(timingMiddleware)  // 第一个执行
	router.Use(loggingMiddleware) // 第二个执行
	router.Use(headerMiddleware)  // 第三个执行

	// 添加路由
	router.HandleFunc("/hello", helloHandler).Methods("GET")

	fmt.Println("中间件演示服务器启动在 :8081")
	fmt.Println("访问 http://localhost:8081/hello 查看中间件执行顺序")

	log.Fatal(http.ListenAndServe(":8081", router))
}
